// 将token存储在vuex中，vuex刷新就没了，需要解决刷新就没了的问题
// import CookieJs from 'js-cookie'
// 已经定义好了 auth.js 封装了CookieJs的方法
import { sysLogin } from '@/api/login'
import { sysProfile, sysUser } from '@/api/user'

import { getToken, setToken } from '@/utils/auth'
import { Message } from 'element-ui'

import asyncRoutes from '@/router/module/index'
import { constantRoutes, resetRouter } from '@/router'
import Router from '@/router'

const state = {
  token: getToken() || '',
  userInfo: ''
}
const mutations = {
  setToken(state, value) {
    state.token = value
    setToken(value)
  },
  setUserInfo(state, value) {
    state.userInfo = value
  },
  // 处理401错误
  logout() {
    // this == this.$store
    this.commit('user/setToken', '')
    this.commit('user/setUserInfo', '')
    // 重置路由
    resetRouter()
  }
}
const getters = {}
const actions = {
  // 登录
  async toLogin(store, form) {
    const res = await sysLogin(form)
    Message.success('登录成功')
    // console.log(res)
    // console.log(2)
    store.commit('setToken', res.data)
  },
  // 获取用户信息
  async getUserIngo({ commit }) {
    const res = await sysProfile()
    // console.log(res)
    // 获取用户头像
    const res2 = await sysUser(res.data.userId)
    // 合并对象
    // 1. {...res, ...res2} 2.返回值 = Object.assign(目标对象，其他对象。。。)
    commit('setUserInfo', Object.assign({}, res.data, res2.data))

    const newArr = asyncRoutes.filter((item) => {
      return res.data.roles.menus.includes(item.meta.name)
    })
    // addRoutes有一点小缺点， 它刚添加的路由配制，需要再经过一次导航守卫后才可正常使用
    Router.addRoutes([...newArr, { path: '*', redirect: '/404', hidden: true }])
    // console.log('newArr', newArr)
    const allRoutesList = [
      // 拿到当前的完整路由信息 静态路由和有权限的路由
      ...constantRoutes,
      ...newArr,
      { path: '*', redirect: '/404', hidden: true }
    ]
    // 本模块的actions里调用其他模块的mutations方法
    // commit('模块名/方法名', 参数值, {root: true})
    commit('routes/setRoutesList', allRoutesList, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
